Редактор.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

ОТДЕЛ editdemo;

ИСПОЛЬЗУЕТ
  Strings, Windows;
ПОСТ
  AppName = 'EditDemo';
ВИД
  TFileName = РЯД [0..Max_Path] ИЗ ЗНАК;
ПЕР
  AMessage             :Msg;
  HWindow,HStatus,HEdit:HWnd;
  TheFont              :HFont;
  TheLogFont           :TLogFont;
  TheColor             :DWORD;
  FileName             :TFileName;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА SetStatusText(Num:ЦЕЛ; Text-:string);
ПЕР
  StatText:РЯД [0..255] ИЗ ЗНАК;
УКАЗ
  ЕСЛИ Num = 0 ТО  
    StatText[0]:=' '  (* Add space to text in first item *)
  ИНАЧЕ 
    StatText[0]:=#9;  (* Center the rest *)
  КОН;
  StrPCopy(@StatText[1],Text);
  SendMessage(HStatus,SB_SETTEXT,WPARAM(Num),LPARAM(@StatText));
КОН SetStatusText;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА SelectFile(FName-:TFileName; Open+:КЛЮЧ):КЛЮЧ;
ПОСТ
  Filter:PChar = 'Text files (*.txt)'#0'*.txt'#0'All files (*.*)'#0'*.*'#0#0;
  Ext   :PChar = 'txt';
ПЕР
  NameRec:OpenFileName;
УКАЗ
  FillChar(NameRec,SizeOf(NameRec),0);
  FName[0]:=#0;
  ДЛЯ NameRec ВЫП
    LStructSize:=SizeOf(NameRec);
    HWndOwner :=HWindow;
    LpStrFilter:=Filter;
    LpStrFile :=@FName;
    NMaxFile  :=Max_Path;
    Flags     :=OFN_Explorer ИЛИ OFN_HideReadOnly;
    ЕСЛИ Open ТО  
      Flags:=Flags ИЛИ OFN_FileMustExist
    КОН;
    LpStrDefExt:=Ext
  КОН;
  ЕСЛИ Open ТО  
    ВОЗВРАТ GetOpenFileName(@NameRec)
  ИНАЧЕ 
    ВОЗВРАТ GetSaveFileName(@NameRec)
  КОН
КОН SelectFile;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА SaveText;
ПЕР
  Len  :ЦЕЛ;
  P    :PChar;
  F    :File;
  FName:TFileName;
УКАЗ
  ЕСЛИ SelectFile(FName,False) ТО  
      Assign(F,@FName);
      Rewrite(F,1);
      Len:=GetWindowTextLength(HEdit);
      GetMem(P,Len+1);
      P[Len]:=#0;
    ЕСЛИ Len>0 ТО  
        GetWindowText(HEdit,P,Len+1);
        BlockWrite(F,P^,Len);
    КОН;
      Close(F);
      FreeMem(P,Len+1);
      StrCopy(FileName,FName);
      SetStatusText(0,StrPas(FileName));
      SetStatusText(1,'');
      SendMessage(HEdit,EM_SetModify,0,0);
  КОН
КОН SaveText;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА AskSave;
ПОСТ
  BoxType = MB_IconQuestion ИЛИ MB_YesNo;
УКАЗ
  ЕСЛИ SendMessage(HEdit,EM_GetModify,0,0) # 0 ТО  
    ЕСЛИ MessageBox(HWindow,'Save text?','Edited',BoxType)=IdYes ТО  
          SaveText;
    КОН;
  КОН
КОН AskSave;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА LoadText;
ПЕР
  F    :File;
  Len  :ЦЕЛ;
  P    :PChar;
УКАЗ
  AskSave;
  ЕСЛИ SelectFile(FileName,True) ТО  
      Assign(F,@FileName);
      Reset(F,1);
      Len:=FileSize(F);
      GetMem(P,Len+1);
      P[Len]:=#0;
    ЕСЛИ Len>0 ТО
        BlockRead(F,P^,Len)
    КОН;
      Close(F);
      SetWindowText(HEdit,P);
      SendMessage(HEdit,EM_SetModify,0,0);
      FreeMem(P,Len+1);
      SetStatusText(0,StrPas(FileName));
      SetStatusText(1,'');
  КОН
КОН LoadText;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА NewText;
ПОСТ
  Empty:PChar = '';
УКАЗ
  AskSave;
  FileName:='Unsaved';
  SetStatusText(0,StrPas(FileName));
  SendMessage(HEdit,WM_SetText,1,LRESULT(Empty));
  SendMessage(HEdit,EM_SetModify,0,0);
КОН NewText;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА SelectFont;
ПЕР
  ChooseFontRec:TChooseFont;
УКАЗ
  ДЛЯ ChooseFontRec ВЫП
      lStructSize  :=SizeOf(ChooseFontRec);
      hwndOwner    :=HWindow;
      hDC          :=0;
      lpLogFont    :=@TheLogFont;
      iPointSize   :=0;
      Flags        :=CF_INITTOLOGFONTSTRUCT ИЛИ CF_SCREENFONTS ИЛИ CF_EFFECTS;
      rgbColors    :=TheColor;
      lCustData    :=0;
      lpfnHook     :=ПУСТО;
      lpTemplateName:=ПУСТО;
      hInstance    :=0;
      lpszStyle    :=ПУСТО;
      nFontType    :=0;
      nSizeMin     :=0;
      nSizeMax     :=0;
  КОН;
  ЕСЛИ ChooseFont(@ChooseFontRec) ТО  
      DeleteObject(TheFont);
      TheColor:=ChooseFontRec.rgbColors;
      TheFont:=CreateFontIndirect(@TheLogFont);
      SendMessage(HEdit,WM_SETFONT,WPARAM(TheFont),1);
  КОН
КОН SelectFont;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА WindowProc (
         Window:HWnd;
         AMessage:UINT;
         WParam:WPARAM;
         LParam:LPARAM):LRESULT;   stdcall;  export;
ПЕР
  R       :rect;
  StatH   :LONG;
  NrMenu  :ЦЕЛ;
  NotiCode:ЦЕЛ;
УКАЗ
  WindowProc:=0;
  ВЫБРАТЬ AMessage ИЗ
  | wm_Close:
        AskSave
  | wm_Destroy:
        PostQuitMessage (0);
        ВОЗВРАТ
  | wm_SetFocus:
        SetFocus(HEdit)
  | WM_EraseBkgnd:
        ВОЗВРАТ(1)
  | wm_Size:
        GetClientRect(HStatus,@R);
        StatH:=R.Bottom-R.Top;
        GetClientRect(Window,@R);
        MoveWindow(HEdit,0,0,R.Right,R.Bottom-StatH,False);
        MoveWindow(HStatus,0,R.Bottom-StatH,R.Right,R.Bottom,False)
  | wm_Command:
        NotiCode:=HiWord(WParam);
        ВЫБРАТЬ NotiCode ИЗ
          en_Change:     (*// Editor has changed *)
            ЕСЛИ SendMessage(HEdit,EM_GetModify,0,0) # 0 ТО  
                SetStatusText(1,'Modified')
            ИНАЧЕ 
                SetStatusText(1,'');
            КОН
        ИНАЧЕ                    (*// Menu item *)
            NrMenu:=LoWord(WParam);
            ВЫБРАТЬ NrMenu ИЗ
            | 101:NewText
            | 102:LoadText
            | 103:SaveText
            | 104:PostMessage(Window,WM_Close,0,0)
            | 201:SendMessage(HEdit,WM_Undo,0,0)
            | 202:SendMessage(HEdit,WM_Cut,0,0)
            | 203:SendMessage(HEdit,WM_Copy,0,0)
            | 204:SendMessage(HEdit,WM_Paste,0,0)
            | 301:SelectFont
            | 401:MessageBox(Window,
                            'Help',
                            'НЕ implemented',
                             MB_OK ИЛИ MB_IconInformation)
            КОН
        КОН
  | wm_CtlColorEdit:
        SetTextColor(WParam,TheColor);
        ВОЗВРАТ GetSysColorBrush(COLOR_WINDOW)
  КОН;
  ВОЗВРАТ DefWindowProc(Window,AMessage,WParam,LParam)
КОН WindowProc;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА WinRegister:КЛЮЧ;
ПЕР
  WindowClass:WndClass;
УКАЗ
  ДЛЯ WindowClass ВЫП
      Style       :=cs_hRedraw ИЛИ cs_vRedraw;
      lpfnWndProc :=WndProc(@WindowProc);
      cbClsExtra  :=0;
      cbWndExtra  :=0;
      hInstance   :=system.MainInstance;
      hIcon       :=LoadIcon (0,idi_Application);
      hCursor     :=LoadCursor (0,idc_Arrow);
      hbrBackground:=GetStockObject(GRAY_BRUSH);
      lpszMenuName:=ПУСТО;
      lpszClassName:=AppName;
  КОН;
  ВОЗВРАТ (RegisterClass(WindowClass) # 0)
КОН WinRegister;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА EditCreate(ParentWindow,Status:HWnd):HWnd;
ПОСТ
  CS_Start = WS_Child ИЛИ WS_HScroll ИЛИ WS_VScroll ИЛИ ES_MultiLine ИЛИ ES_Left;
  CS_Ex    = WS_EX_ClientEdge;
  EdiTText:PChar = '';
ПЕР
  HEdit:HWND;
  R    :TRect;
  StatH:Word;
УКАЗ
  GetClientRect(Status,@R);
  StatH:=R.Bottom-R.Top;
  GetClientRect(ParentWindow,@R);
  HEdit:=CreateWindowEx (CS_Ex,
                        'EDIT',
                         EditText,CS_Start,0,0,
                         R.Right-R.Left,
                         R.Bottom-R.Top-StatH,
                         ParentWindow,0,
                         MainInstance,ПУСТО);
  ЕСЛИ HEdit # 0 ТО       (*// Set Courier new as default font *)
    ДЛЯ TheLogFont ВЫП
          lfHeight       :=0;   (*//  Default logical height ИЗ font *)
          lfWidth        :=0;   (*//  Default logical average character width *)
          lfEscapement   :=0;   (*//  angle ИЗ escapement *)
          lfOrientation  :=0;          (*//  base-line orientation angle *)
          lfWeight       :=FW_NORMAL;  (*//  font weight *)
          lfItalic       :=0;          (*//  italic attribute flag *)
          lfUnderline    :=0;          (*//  underline attribute flag *)
          lfStrikeOut    :=0;                (*//  strikeout attribute flag *)
          lfCharSet      :=DEFAULT_CHARSET;  (*//  character set identifier *)
          lfOutPrecision :=OUT_DEFAULT_PRECIS;  (*//  output precision *)
          lfClipPrecision:=CLIP_DEFAULT_PRECIS; (*//  clipping precision *)
          lfQuality      :=DEFAULT_QUALITY;     (*//  output quality *)
          lfPitchAndFamily:=DEFAULT_PITCH;      (*//  pitch И family *)
          Strcopy(lfFaceName,'Courier New'); (*//  pointer to typeface name string *)
    КОН;
      TheColor:=GetSysColor(COLOR_WINDOWTEXT);
      TheFont:=CreateFontIndirect(@TheLogFont);
      SendMessage(HEdit,WM_SETFONT,WPARAM(TheFont),1);
      ShowWindow(Hedit,SW_Show);
      UpdateWindow(HEdit);
  КОН;
  ВОЗВРАТ HEdit
КОН EditCreate;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА WinCreate:HWnd;

ПЕР hWindow:HWnd;
    Menu   :hMenu;
    SubMenu:hMenu;
УКАЗ
  hWindow:=CreateWindow (AppName,
                        'EditDemo',
                         ws_OverlappedWindow,
                         cw_UseDefault,
                         cw_UseDefault,
                         cw_UseDefault,
                         cw_UseDefault,0,0,MainInstance,ПУСТО);
  ЕСЛИ hWindow # 0 ТО  
      Menu:=CreateMenu;
      SubMenu:=CreateMenu;
      AppendMenu(Submenu,MF_STRING,101,'&New...');
      AppendMenu(Submenu,MF_STRING,102,'&Open...');
      AppendMenu(Submenu,MF_STRING,103,'&Save...');
      AppendMenu(Submenu,MF_SEPARATOR,0,ПУСТО);
      AppendMenu(SubMenu,MF_String,104,'E&xit');
      AppendMenu(Menu,MF_POPUP,SubMenu,'&File');
      SubMenu:=CreateMenu;
      AppendMenu(SubMenu,MF_String,201,'&Undo'#8'Ctrl+Z');
      AppendMenu(Submenu,MF_SEPARATOR,0,ПУСТО);
      AppendMenu(SubMenu,MF_String,202,'&Cut'#8'Ctrl+X');
      AppendMenu(SubMenu,MF_String,203,'&Copy'#8'Ctrl+C');
      AppendMenu(SubMenu,MF_STRING,204,'&Paste'#8'Ctrl+V');
      AppendMenu(Menu,MF_POPUP,SubMenu,'&Edit');
      SubMenu:=CreateMenu;
      AppendMenu(SubMenu,MF_String,301,'&Font...');
      AppendMenu(Menu,MF_POPUP,SubMenu,'&Options');
      AppendMenu(Menu,MF_STRING,401,'&Help');
      SetMenu(hWindow,menu);
      ShowWindow(hWindow,SW_Show);
      UpdateWindow(hWindow);
  КОН;
  ВОЗВРАТ hWindow
КОН WinCreate;

(*────────────────────────────────────────────────────────────────────────────*)
ЗАДАЧА StatusCreate (parent:hwnd):HWnd;
ПЕР
  AWnd  :HWnd;
  Edges :РЯД [1..2] ИЗ ЦЕЛ;
УКАЗ
  FileName:='Unsaved';
  AWnd:=CreateStatusWindow(WS_CHILD ИЛИ WS_VISIBLE,FileName,Parent,$7712);
                      (*// Create items: *)
  ЕСЛИ AWnd # 0 ТО
      Edges[1]:=400;
      Edges[2]:=500;
      SendMessage(AWnd,SB_SETPARTS,2,LPARAM(@Edges));
  КОН;
  ВОЗВРАТ AWnd
КОН StatusCreate;

(*────────────────────────────────────────────────────────────────────────────*)
УКАЗ
  ЕСЛИ НЕ WinRegister ТО  
      MessageBox(0,'Register failed',ПУСТО,mb_Ok);
  ИНАЧЕ 
      hWindow:=WinCreate;
    ЕСЛИ ЦЕЛ(hWindow) = 0 ТО  
          MessageBox(0,'WinCreate failed',ПУСТО,MB_OK);
    ИНАЧЕ 
          HStatus:=statuscreate(hwindow);
          HEdit:=EditCreate(HWindow,HStatus);
          SetFocus(HEdit);
      ПОКА GetMessage(@AMessage,0,0,0) ВЫП
              TranslateMessage(AMessage);
              DispatchMessage(AMessage);
      КОН;
          DeleteObject(TheFont);
      СТОП(AMessage.wParam);
    КОН
  КОН
КОН editdemo.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы